﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using CAOS.Entity;
using CAOS.UnityOfWork;
using CAOS.Facade;

namespace CAOS.Web.Controllers
{
    [Authorize]
    public class PapelController : BusinessController
    {
        public ViewResult Index()
        {
            var papeis = UnidadeDeTrabalho.PapelRepository.List(s => s.SistemaID == Configuracao.Sistema.SistemaID, p => p.OrderBy(ps => ps.Nome), "Sistema");
            return View(papeis.ToList());
        }

        #region Criar

        public ActionResult Create()
        {
            ViewBag.SiglaSistema = Configuracao.Sistema.Sigla;
            return View();
        }

        [HttpPost]
        public ActionResult Create(Papel papel)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    papel.Sistema = UnidadeDeTrabalho.SistemaRepository.GetByID(Configuracao.Sistema.SistemaID);
                    UnidadeDeTrabalho.PapelRepository.Insert(papel);
                    UnidadeDeTrabalho.Save();
                    return RedirectToAction("Index");
                }
                catch (CAOSDALException exception)
                {
                    ViewBag.Mensagem = exception.Message;
                    ViewBag.SiglaSistema = papel.Sistema.Sigla;
                    return View(papel);
                }
            }

            return View(papel);
        }

        #endregion

        #region Editar

        public ActionResult Edit(int id)
        {
            Papel papel = UnidadeDeTrabalho.PapelRepository.GetByCondition(p => p.PapelID == id, "Sistema");
            ViewBag.SiglaSistema = papel.Sistema.Sigla;
            return View(papel);
        }

        [HttpPost]
        public ActionResult Edit(Papel papel)
        {
            if (ModelState.IsValid)
            {
                var papelEditado = UnidadeDeTrabalho.PapelRepository.GetByCondition(p => p.PapelID == papel.PapelID, "Sistema");
                papelEditado.Nome = papel.Nome;

                try
                {
                    UnidadeDeTrabalho.PapelRepository.Update(papelEditado);
                    UnidadeDeTrabalho.Save();
                    return RedirectToAction("Index");
                }
                catch (CAOSDALException exception)
                {
                    ViewBag.Mensagem = exception.Message;
                    ViewBag.SiglaSistema = Configuracao.Sistema.Sigla;
                    return View(papel);
                }
            }

            return View(papel);
        }

        #endregion

        #region Deletar

        public ActionResult Delete(int id)
        {
            Papel papel = UnidadeDeTrabalho.PapelRepository.GetByCondition(p => p.PapelID == id, "Sistema");
            return View(papel);
        }

        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {
            Papel papel = UnidadeDeTrabalho.PapelRepository.GetByCondition(p => p.PapelID == id, "Sistema");

            try
            {
                UnidadeDeTrabalho.PapelRepository.Delete(id);
                UnidadeDeTrabalho.Save();
                return RedirectToAction("Index");
            }
            catch (CAOSDALException exception)
            {
                ViewBag.Mensagem = exception.Message;
                UnidadeDeTrabalho.PapelRepository.Refresh(papel);
                return View(papel);
            }
        }

        #endregion

        #region AssociarUsuario

        public ActionResult AssociarUsuarios()
        {
            var papeis = UnidadeDeTrabalho.PapelRepository.List(s => s.Sistema.SistemaID == Configuracao.Sistema.SistemaID, p => p.OrderBy(pa => pa.Codigo));
            ViewBag.PapelID = new SelectList(papeis, "PapelID", "Codigo");
            return View();
        }

        public ActionResult ListarUsuarios(int papelID)
        {
            if (papelID != 0)
            {
                var usuarios = UnidadeDeTrabalho.PapelRepository.GetByID(papelID).Usuarios;
                return PartialView("_UsuariosPartial", usuarios);
            }
            else
            {
                return Content("Nenhum usuário encontrado.");
            }
        }

        public ActionResult AdicionarUsuario(string loginUsuario, int papelID)
        {
            var usuario = UsuarioFacade.LerUsuario(loginUsuario);

            Papel papel = UnidadeDeTrabalho.PapelRepository.GetByID(papelID);

            if (usuario == null || papel == null)
            {
                return Content("Usuário não encontrado");
            }
            else
            {
                papel.Usuarios.Add(usuario);
                UnidadeDeTrabalho.PapelRepository.Update(papel);
                UnidadeDeTrabalho.Save();
                return Content("Usuário adicionado com sucesso.");
            }
        }

        #endregion


        #region Associar Recurso

        public ActionResult AssociarRecursos()
        {
            var papeis = UnidadeDeTrabalho.PapelRepository.List(s => s.Sistema.SistemaID == Configuracao.Sistema.SistemaID, p => p.OrderBy(pa => pa.Codigo));
            ViewBag.PapelID = new SelectList(papeis, "PapelID", "Codigo");

            var recursos = UnidadeDeTrabalho.RecursoRepository.List(s => s.Sistema.SistemaID == Configuracao.Sistema.SistemaID, r => r.OrderBy(re => re.Codigo));
            ViewBag.RecursoID = new SelectList(recursos, "RecursoID", "Codigo");

            return View();
        }

        public ActionResult ListarRecursos(int papelID)
        {
            if (papelID != 0)
            {
                var recursos = UnidadeDeTrabalho.PapelRepository.GetByID(papelID).RecursosPermitidos;
                return PartialView("_RecursosPartial", recursos);
            }
            else
            {
                return Content("Nenhum recurso encontrado.");
            }
        }

        public ActionResult AdicionarRecurso(int recursoID, int papelID)
        {
            var recurso = UnidadeDeTrabalho.RecursoRepository.GetByID(recursoID);

            Papel papel = UnidadeDeTrabalho.PapelRepository.GetByID(papelID);

            if (recurso == null || papel == null)
            {
                return Content("Recurso não encontrado");
            }
            else
            {
                papel.RecursosPermitidos.Add(recurso);
                UnidadeDeTrabalho.PapelRepository.Update(papel);
                UnidadeDeTrabalho.Save();
                return Content("Recurso adicionado com sucesso.");
            }
        }

        #endregion


        protected override void Dispose(bool disposing)
        {
            UnidadeDeTrabalho.Dispose();
            base.Dispose(disposing);
        }
    }
}